package com.sleep.psy.external_server.utils;
import java.time.Duration;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;



/**
 * @author wenliguo
 * @date 2025年09月01日 10:03
 */
public class SleepSuggestionGeneratorUtils {
    /**
     * 计算睡眠指标并生成对应提示语
     * @param t1 上床时间（时刻点，如21:30）
     * @param t2 入睡时间（时刻点，如22:00）
     * @param t3 早晨醒来时间（时刻点，如6:30）
     * @param t4 起床时间（时刻点，如6:40）
     * @param t5 中途清醒总时长（时间段，如0小时10分钟）
     * @param t6 午休时间（时间段，如0小时30分钟，当前逻辑中用于提示建议，暂不参与核心计算）
     * @return 符合条件的所有提示语列表（无符合条件则返回默认提示）
     */
    public static List<String> generateSleepTips(LocalTime t1, LocalTime t2, LocalTime t3,
                                                 LocalTime t4, Duration t5, Duration t6) {
        List<String> tips = new ArrayList<>();

        // -------------------------- 1. 计算核心指标：W（睡眠绝对时间）、Q（睡眠效率） --------------------------
        // 处理W：t3-t2（跨天情况需加24小时，如t2=23:00，t3=6:00 → W=7小时）
        Duration W = Duration.between(t2, t3);
        if (W.isNegative()) {
            W = W.plusHours(24); // 跨天修正：负时长+24小时
        }
        long WMinutes = W.toMinutes(); // 转换为分钟，便于精确判断（4小时=240分钟）

        // 处理分母：t4-t1（总在床时间，跨天修正）
        Duration timeInBed = Duration.between(t1, t4);
        if (timeInBed.isNegative()) {
            timeInBed = timeInBed.plusHours(24);
        }
        long timeInBedMinutes = timeInBed.toMinutes();

        // 计算Q：睡眠效率 = (W - t5) / (t4 - t1) * 100%（避免分子为负，分母为0）
        double Q = 0.0;
        if (timeInBedMinutes > 0) { // 避免分母为0
            long effectiveSleepMinutes = Math.max(WMinutes - t5.toMinutes(), 0); // 有效睡眠时长（最小为0）
            Q = (effectiveSleepMinutes * 1.0 / timeInBedMinutes) * 100;
        } else {
            tips.add("数据异常：上床时间（t1）与起床时间（t4）无法构成有效在床时长，请核对时间");
            return tips;
        }

        // -------------------------- 2. 第一组判断：W（睡眠时长）与Q（睡眠效率） --------------------------
        boolean condition1 = WMinutes <= 240; // ① W≤4小时（4*60=240分钟）
        boolean condition2 = Q <= 80;         // ② Q≤80%
        if (condition1 && condition2) {
            tips.add("您的睡眠效率偏低，睡眠时长不足，可能存在日间生活工作精力不足的情况");
        } else if (condition1) {
            tips.add("您的睡眠时长不足，但睡眠效率比较高，若影响日间生活工作则需要进行干预，若白天精力充沛也可不进行干预");
        } else if (condition2) {
            tips.add("您的睡眠效率较低，为提高睡眠效率，可以采取缩短在床时间，减少白天休息时间，增加白天活动量，丰富自己兴趣爱好等方式");
        }
        // ①②都不满足则不输出

        // -------------------------- 3. 第二组判断：上床时间过早/入睡延迟 --------------------------
        boolean condition3 = t1.isBefore(LocalTime.of(22, 0)); // ③ t1早于22:00
        // ④ (t2-t1)＞30分钟（跨天情况：如t1=23:00，t2=0:10 → 差值70分钟，需修正）
        Duration t2MinusT1 = Duration.between(t1, t2);
        if (t2MinusT1.isNegative()) {
            t2MinusT1 = t2MinusT1.plusHours(24);
        }
        boolean condition4 = t2MinusT1.toMinutes() > 30;

        if (condition3 || condition4) {
            // 计算建议新t1：(t2-30min)，若早于22:00则取22:00，否则取(t2-30min)
            LocalTime suggestedT1 = t2.minusMinutes(30);
            if (suggestedT1.isBefore(LocalTime.of(22, 0))) {
                suggestedT1 = LocalTime.of(22, 0);
            }
            tips.add(String.format("您的上床时间过早或入睡延迟，这可能会导致您入睡困难或者睡眠效率下降，建议您将上床时间延迟到%s",
                    formatLocalTime(suggestedT1)));
        }
        // ③④都不满足则不输出

        // -------------------------- 4. 第三组判断：起床时间过晚/醒来后赖床 --------------------------
        boolean condition6 = t4.isAfter(LocalTime.of(7, 0)); // ⑥ t4晚于7:00
        // ⑤ (t4-t3)＞30分钟（跨天情况修正）
        Duration t4MinusT3 = Duration.between(t3, t4);
        if (t4MinusT3.isNegative()) {
            t4MinusT3 = t4MinusT3.plusHours(24);
        }
        boolean condition5 = t4MinusT3.toMinutes() > 30;

        if (condition5 || condition6) {
            // 计算建议新t4：(t4-30min)，若晚于7:00则取7:00，否则取(t4-30min)
            LocalTime suggestedT4 = t4.minusMinutes(30);
            if (suggestedT4.isAfter(LocalTime.of(7, 0))) {
                suggestedT4 = LocalTime.of(7, 0);
            }
            tips.add(String.format("您的起床时间过晚或醒来后赖床，这可能会导致您睡眠效率下降、睡眠质量不佳，建议您将起床时间提前到%s",
                    formatLocalTime(suggestedT4)));
        }
        // ⑤⑥都不满足则不输出

        // -------------------------- 5. 三组均无提示时，输出默认内容 --------------------------
        if (tips.isEmpty()) {
            tips.add("根据您填写的时间，您的睡眠时间不存在特别大的问题，若您仍旧感觉自己睡眠质量不好或者是白天精力不足，建议您使用睡眠训练营进一步调整睡眠认知和行为习惯，并进行情绪量表测评，以排查是否存在抑郁情绪或者焦虑情绪等问题");
        }

        return tips;
    }

    /**
     * 格式化LocalTime为"HH:mm"格式（如22:00，避免单数字小时/分钟，如6:5→06:05）
     */
    private static String formatLocalTime(LocalTime time) {
        int hour = time.getHour();
        int minute = time.getMinute();
        return String.format("%02d:%02d", hour, minute);
    }

    // -------------------------- 测试示例 --------------------------
    public static void main(String[] args) {
        // 测试数据：t1=21:00, t2=21:40, t3=6:00, t4=6:30, t5=0h10m, t6=0h30m
        LocalTime t1 = LocalTime.of(22, 00);
        LocalTime t2 = LocalTime.of(22, 30);
        LocalTime t3 = LocalTime.of(05, 00);
        LocalTime t4 = LocalTime.of(05, 30);
        Duration t5 = Duration.ofMinutes(10);
        Duration t6 = Duration.ofMinutes(30);

        // 生成提示并打印
        List<String> tips = generateSleepTips(t1, t2, t3, t4, t5, t6);
        System.out.println("睡眠方案提示：");
        for (int i = 0; i < tips.size(); i++) {
            System.out.printf("%d. %s%n", i + 1, tips.get(i));
        }
    }
}
